Nesse exercício iremos importar, gerar e comparar a centralidade de 2 grafos:
In [1]:
import network_analysis_utils as nau
import networkx as nx
# Available functions:
#
# - nau.facebook_nx_graph(): Obtém o grafo Networkx do facebook
#
# - nau.random_nx_graph(): Obtém o grafo Networkx randômico
#
# - nau.write_btwns_graph(nx_graph, weight_dict, output_filename):
# Plota o grafo em um arquivo de acordo com o dicionário de pessos obtidos do "betwenness centrality"
#
# Obs: o prefixo 'nx' indica o uso da Networkx, a lib de grafos utilizada nesse exercício
Agora você deve escrever a sua função que computa a betweenness centrality para um grafo nx:
Dica: recomendo fortemente o uso da all_shortest_paths da Networkx
Requisito: Não vale usar a função de betweenness centrality do networkx
In [2]:
# ALGORITHM: Betweenness Centrality
# INPUT: G(V, E)
# OUTPUT: Dictionary(V, Weights)
#
# BEGIN
# result <- init_empty_betweenness(V)
#
# FOR EACH vi, vj in V THEN
#
# IF vi < vj THEN
#
# shortest_paths <- get_shortest_paths(G, vi, vj)
#
# contribuition <- 1 / SIZE_OF(shortest_paths)
#
# FOR EACH path IN shortest_paths THEN
#
# FOR EACH pi IN path IF pi != vi AND pi != pj
#
# result[pi] += contribuition
#
# RETURN result
# END
def betweenness_centrality(nx_graph):
""" Return the weight dictionary {node: betweenness centrality} """
nodes = nx_graph.nodes()
edges = nx_graph.edges()
btwns_dict = { node: 0.0 for node in nodes }
for node in nodes:
for other in nodes:
if (node < other): # don't double count
paths = [p for p in nx.all_shortest_paths(nx_graph, node, other)]
contrib = 1.0 / len(paths)
for path in paths:
for n in path:
if n not in [node, other]:
btwns_dict[n] += contrib
return btwns_dict
Agora que temos nossa função de centralidade pronta, podemos obter a centralidades para os dois gráficos:
In [3]:
facebook_graph = nau.facebook_nx_graph()
random_graph = nau.random_nx_grap()
facebook_btwns = betweenness_centrality(facebook_graph)
random_btwns = betweenness_centrality(random_graph)
E agora geraremos os gráficos dos grafos para análise visual:
In [4]:
nau.write_btwns_graph(facebook_graph, facebook_btwns, 'facebook_btwns_graph.png')
nau.write_btwns_graph(random_graph, random_btwns, 'random_btwns_graph.png')
Agora abra os dois arquivos gerados: facebook_btwns_graph.png e random_btwns_graph.png e analise a distribuição da centralidade.